﻿using System;
using System.Collections.Generic;
using System.Text;
using TM.QWeibo.SDK.Objects;

namespace TM.QWeibo.SDK.API
{

    /// <summary>
    /// 与时间线相关的接口实现
    /// </summary>
    public class Timeline
        : RequestBase
    {
        /// <summary>
        /// 根据授权对象实例化
        /// </summary>
        /// <param name="oauth"></param>
        public Timeline(OAuth oauth) : base(oauth)
        { }

        /// <summary>
        /// 回调方法
        /// </summary>
        Action<ResponseData<Tweet>> CallBack { get; set; }

        /// <summary>
        /// 获取时间线结束回调
        /// </summary>
        /// <param name="json"></param>
        private void GetTimeLineEnd(string json)
        {
            try
            {
                var obj = Util.JsonToObject<ResponseData<Tweet>>(json);
                obj.Data.Users = Util.DesUserList(json);
                if(CallBack!=null)
                {
                    CallBack(obj);
                }
            }
            catch(Exception e)
            {
                throw new Exception(e.Message);
            }

        }

        #region 主页时间线

        /// <summary>
        /// 获取主页时间线数据
        /// </summary>
        /// <param name="pageflag">分页标识</param>
        /// <param name="pagetime">本页起始时间（第一页 0，继续：根据返回记录时间决定）</param>
        /// <param name="reqnum">每次请求记录的条数（1-20条）</param>
        /// <param name="callback"></param>
        public void GetHomeTimeline(PageFlag pageflag, long pagetime, int reqnum, Action<ResponseData<Tweet>> callback)
        {
            this.CallBack = callback;
            GetHomeTimeline("http://open.t.qq.com/api/statuses/home_timeline", pageflag, pagetime, reqnum, GetTimeLineEnd);
        }

        /// <summary>
        /// 获取主页时间线数据
        /// </summary>
        /// <param name="requestUrl">API请求地址</param>
        /// <param name="pageflag">分页标识</param>
        /// <param name="pagetime">本页起始时间（第一页 0，继续：根据返回记录时间决定）</param>
        /// <param name="reqnum">每次请求记录的条数（1-20条）</param>
        /// <param name="callback"></param>
        private void GetHomeTimeline(string requestUrl, PageFlag pageflag, long pagetime, int reqnum, Action<string> callback)
        {
            var parameters = new Parameters();
            parameters.Add("format", this.ResponseDataFormat.ToString().ToLower());
            parameters.Add("pageflag", (int)pageflag);
            parameters.Add("pagetime", pagetime);
            parameters.Add("reqnum", reqnum);
            //parameters.Add("rnd", Guid.NewGuid().ToString());
            GetData(requestUrl, parameters, callback);
        }

        /// <summary>
        /// 获取我的广播时间线数据
        /// </summary>
        /// <param name="pageflag">分页标识</param>
        /// <param name="pagetime">本页起始时间（第一页 0，继续：根据返回记录时间决定）</param>
        /// <param name="reqnum">每次请求记录的条数（1-20条）</param>
        /// <param name="callback"></param>
        public void GetMyBroadcast(PageFlag pageflag, long pagetime, int reqnum, Action<ResponseData<Tweet>> callback)
        {
            this.CallBack = callback;
            GetHomeTimeline("http://open.t.qq.com/api/statuses/broadcast_timeline", pageflag, pagetime, reqnum, GetTimeLineEnd);
        }

        #endregion

        #region 用户提及时间线
        /// <summary>
        /// 采用默认API请求地址获取用户提及时间线
        /// </summary>
        /// <param name="pageflag">分页标识</param>
        /// <param name="pagetime">本页起始时间（第一页 0，继续：根据返回记录时间决定）</param>
        /// <param name="reqnum">每次请求记录的条数（1-20条）</param>
        /// <param name="lastid">当前页最后一条记录，用用精确翻页用</param>        
        /// <param name="callback">回调</param>
        /// <returns>获取最新n条@提到我的微博。</returns>
        public void GetMentionsTimeline(PageFlag pageflag, long pagetime, int reqnum, long lastid, Action<ResponseData<Tweet>> callback)
        {
            this.CallBack = callback;
            var parameters = new Parameters();
            parameters.Add("format", this.ResponseDataFormat.ToString().ToLower());
            parameters.Add("pageflag", (int)pageflag);
            parameters.Add("pagetime", pagetime);
            parameters.Add("reqnum", reqnum);
            parameters.Add("lastid", lastid);
            GetData("http://open.t.qq.com/api/statuses/mentions_timeline", parameters, GetTimeLineEnd);
        }

        #endregion

        #region 广播大厅时间线
        /// <summary>
        /// 获取广播大厅时间线
        /// </summary>
        /// <param name="pos">记录的起始位置（第一次请求是填0，继续请求进填上次返回的pos）</param>
        /// <param name="reqnum">每次请求记录的条数（1-20条）</param>
        public void GetPublicTimeline(long pos, int reqnum,Action<ResponseData<Tweet>> callback)
        {
            var parameters = new Parameters();
            parameters.Add("format", this.ResponseDataFormat.ToString().ToLower());
            parameters.Add("pos", pos);
            parameters.Add("reqnum", reqnum);
            GetData("http://open.t.qq.com/api/statuses/public_timeline", parameters, (json) =>
            {
                if (!string.IsNullOrEmpty(json))
                {
                    var rs = Util.JsonToObject<ResponseData<Tweet>>(json);
                    callback(rs);
                }
            });
        }
        
        #endregion

        #region 其他用户发表时间线

        /// <summary>
        /// 获取其他用户发表时间线
        /// </summary>
        /// <param name="pageflag">分页标识</param>
        /// <param name="pagetime">本页起始时间（第一页 0，继续：根据返回记录时间决定）</param>
        /// <param name="reqnum">每次请求记录的条数（1-20条）</param>
        /// <param name="name">微博用户名</param>
        /// <param name="callback"></param>
        public void GetUserTimeline(PageFlag pageflag, long pagetime, int reqnum, string name, Action<ResponseData<Tweet>> callback)
        {
            //this.GetUserTimeline("http://open.t.qq.com/api/statuses/user_timeline", pageflag, pagetime, reqnum, name,callback);
            this.CallBack = callback;
            var parameters = new Parameters();
            parameters.Add("format", this.ResponseDataFormat.ToString().ToLower());
            parameters.Add("pageflag", (int)pageflag);
            parameters.Add("pagetime", pagetime);
            parameters.Add("reqnum", reqnum);
            parameters.Add("name", name);
            GetData("http://open.t.qq.com/api/statuses/user_timeline", parameters, GetTimeLineEnd);
        }

        #endregion

        #region 特别收听用户时间线

        /// <summary>
        /// 特别收听用户时间线
        /// </summary>
        /// <param name="pageflag">分页标识</param>
        /// <param name="pagetime">本页起始时间（第一页 0，继续：根据返回记录时间决定）</param>
        /// <param name="reqnum">每次请求记录的条数（1-20条）</param>
        /// <param name="callback"></param>
        public void GetSpecialTimeline(PageFlag pageflag, long pagetime, int reqnum, long lastid, Action<ResponseData<Tweet>> callback)
        {
            this.CallBack = callback;
            var parameters = new Parameters();
            parameters.Add("format", this.ResponseDataFormat.ToString().ToLower());
            parameters.Add("pageflag", (int)pageflag);
            parameters.Add("pagetime", pagetime);
            parameters.Add("reqnum", reqnum);
            parameters.Add("lastid", lastid);
            GetData("http://test.open.t.qq.com/#statuses/special_timeline", parameters, GetTimeLineEnd);
        }

        #endregion

        #region 话题时间线
        /// <summary>
        /// 采用默认API请求地址获取话题时间线
        /// </summary>
        /// <param name="pageflag">翻页标识(第一次务必填零)pageflag=1表示向下翻页：tweetid和time是上一页的最后一个帖子ID和时间； pageflag=2表示向上翻页：tweetid和time是下一页的第一个帖子ID和时间；</param>
        /// <param name="httext">话题名字</param>
        /// <param name="pageinfo">微博帖子ID（详细用法见pageflag）</param>
        /// <param name="time">微博帖子生成时间（详细用法见pageflag）</param>
        /// <param name="reqnum">每次请求记录的条数（1-20条）</param>
        /// <param name="flag">是否拉取认证用户，用作筛选。0-拉取所有用户，0x01-拉取认证用户</param>
        /// <param name="type">1-原创发表，2-转载，3-私信，4-回复，5-空回，6-提及，7-点评</param> 
        public void GetHTTimeline(PageFlag pageflag, string httext, string tweetid, string time, int reqnum, string flag,Objects.Tweet.ETweetType type, Action<ResponseData<Tweet>> callback)
        {
            var parameters = new Parameters();
            parameters.Add("format", this.ResponseDataFormat.ToString().ToLower());
            parameters.Add("pageflag", (int)pageflag);
            parameters.Add("httext", httext);
            parameters.Add("tweetid", string.IsNullOrEmpty(tweetid) ? "0" : tweetid);
            parameters.Add("time", string.IsNullOrEmpty(time)?"0":time);
            parameters.Add("flag", string.IsNullOrEmpty(flag) ? "0" : flag);
            parameters.Add("type", type.GetHashCode().ToString());
            parameters.Add("reqnum", reqnum);
            GetData("http://open.t.qq.com/api/statuses/ht_timeline", parameters, (json) =>
            {
                if (!string.IsNullOrEmpty(json))
                {
                    var rs = Util.JsonToObject<ResponseData<Tweet>>(json);
                    callback(rs);
                }
            });
        }

        public void GetMyFavTimeline(PageFlag pageflag,long pagetime,int reqnum,long lastid,Action<ResponseData<Tweet>> callback) {
            var parameters = new Parameters();
            parameters.Add("format", this.ResponseDataFormat.ToString().ToLower());
            parameters.Add("pageflag", (int)pageflag);
            parameters.Add("pagetime", pagetime);
            parameters.Add("lastid", lastid);
            parameters.Add("reqnum", reqnum);
            GetData("http://open.t.qq.com/api/fav/list_t", parameters, (json) =>
            {
                if (!string.IsNullOrEmpty(json))
                {
                    var rs = Util.JsonToObject<ResponseData<Tweet>>(json);
                    callback(rs);
                }
            });
        }

        #endregion
    }
}
